package com.cskaoyan.javase.oop2._1extends._5protected._3example;
/**
 * Object类是Java中所有类的父类，Java中任何类都会继承它的成员
 * Object类当中，有一个clone方法，它的访问权限就是protected
 * Object类在java.lang包下
 *
 *
 * @since 17:17
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 思考：这里创建A的对象，能不能调用clone方法呢？
        /*
            是不行的，原因是没有访问权限
            这个类是Demo类，它是Object类不同包下的子类
            但是在不同包的子类中，只能创建子类自身对象，才能够访问从父类中继承过来的受保护成员
         */
        A a = new A();
        // 'clone()' has protected access in 'java.lang.Object'
        // a.clone()

        // 这里调用clone方法，只能创建Demo子类自身对象才可以
        Demo d = new Demo();
        // Unhandled exception: java.lang.CloneNotSupportedException 编译时异常
        d.clone();

        // 思考：这里创建B的对象，能不能调用clone方法呢？
        B b = new B();
        b.clone();
    }
}
class A{
    int num;
    public void method(int num){
        this.num = num;
    }
    public void test() throws CloneNotSupportedException {
        // 能不能调用自身的clone方法？可以，而且可以直接调用,因为有this
        clone();
    }
}
class B{
    /*
        扩展一下:
        方法的重写语法除了可以修改父类方法的实现,还可以修改访问权限
        以下方法虽然看起来只是照抄了Object类当中的方法
        但是访问权限仍然修改了,现在这个包下已经可以随意访问了
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}